/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BL;

import BE.*;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

import java.sql.Time;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.StringTokenizer;

/**
 *
 * @author hunter2409
 */
public class BLCargaMasiva {
    
    
    File objfile;
    ArrayList<String> lstCadenas;
    private ArrayList<BEPaleta> lstPaletas;
    private ArrayList<BEZona> lstZonas;
    private ArrayList<BEProducto> lstProductos;
    private ArrayList<BERack> lstRacks;
    private ArrayList<BEAlmacen> lstAmacenes;
    private ArrayList<BEPallet> lstPallets;
    ArrayList<Integer> lstIdContactos;
    private ArrayList<BEContacto> lstContactos;
    BLPaleta objGestorPaleta;
    BLZona objGestorZona;
    BLProducto objGestorProducto;
    BLRack objGestorRack;
    BLAlmacen objGestorAlmacen;
    BLPallet objGestorPallet;
    BLContacto objGestorContacto;
    
    private BEPallet objPallet;
    private BEPosicion objPosResultado;
    private BERack objRack;
    private BEPosicionxRack objPosAux;
    
    public BLCargaMasiva(File file)
    {
        objfile= file;
        lstCadenas= new ArrayList<String>();
        lstPaletas= new ArrayList<BEPaleta>();
        lstZonas= new ArrayList<BEZona>();
        lstProductos = new ArrayList<BEProducto>();
        lstRacks = new ArrayList<BERack>();
        lstAmacenes = new ArrayList<BEAlmacen>();
        lstPallets= new ArrayList<BEPallet>();
        lstIdContactos = new ArrayList<Integer>();
        lstContactos= new ArrayList<BEContacto>();
        objGestorProducto= new BLProducto();
        objGestorPaleta= new BLPaleta();
        objGestorZona= new BLZona();
        objGestorRack = new BLRack();
        objGestorAlmacen = new BLAlmacen();
        objGestorPallet= new BLPallet();
        objGestorContacto= new BLContacto();
        
    }
    
    
    
    public void cargarDatos() throws FileNotFoundException, IOException, ParseException
    {
        
        llenarArregloCadenas();
        llenarArregloObjetos(); 
        
  
    }
    
    public void llenarEnBaseDeDatos()
    {
        for (BEAlmacen almacen:getLstAmacenes())
            objGestorAlmacen.actualiza(almacen);
        for(BEZona zon:getLstZonas())
            objGestorZona.agregarZonaCargaMasiva(zon);
        for (BERack rack:getLstRacks())
            objGestorRack.agregaRackCargaMasiva(rack);
        for (BEContacto con:getLstContactos())
            objGestorContacto.agregarContactoCargaMavisa(con);
        for (BEProducto pro:getLstProductos())
            objGestorProducto.agregarProductoCargaMasiva(pro,pro.getLstProdxTipoPalleta());
        
        for(BEPaleta pal:getLstPaletas())
            objGestorPaleta.agregarPaletaCargaMasiva(pal);
       
        for (BEPallet pall:getLstPallets())
            objGestorPallet.agregarPalletCargaMasiva(pall);
        
        
    }
    
    public void internarPallets()
    {
        
        BLmovimiento blmov = new BLmovimiento();
        BLPosicionxrack objGestorPosRack = new BLPosicionxrack();
        BEPallet pall;
        BLCardex objGestotCardex= new BLCardex();
        
        for(int i=0;i<getLstPallets().size();i++)
        {   
            pall=getLstPallets().get(i);
            int idTipoProd=objGestorProducto.getTipoProdbyId(pall.getProducto().getIdProducto());
            pall.getProducto().setIdTipoProducto(idTipoProd);
        
            BLInternamiento objGestorInternamiento = new BLInternamiento(idTipoProd);
            
            objGestorInternamiento= new BLInternamiento(idTipoProd);
            
            
            objPallet=pall;
            objPosResultado = objGestorInternamiento.buscarPosicionInternamiento(objPallet);
            objRack =objGestorInternamiento.obtenerRack();
            objPosAux=objGestorInternamiento.obtenerPosiciondelRack();
            
             if((objPosResultado!=null)&&(objPosAux!=null))
             {
                 BEMovimiento objMovimiento= new BEMovimiento();
            //objMovimiento.setContacto(objcontacto);
            
                ArrayList<BELineaMovimiento> lstLineaMov=new ArrayList<BELineaMovimiento>();

                BELineaMovimiento objLinMov= new BELineaMovimiento();
                
                pall.setEstado("UBICADO");

                objLinMov.setPallet(pall);
                objLinMov.setCantidad(objPallet.getCantidad());
                lstLineaMov.add(objLinMov);
                BEPosicionxRack objPosInicial= new BEPosicionxRack();

                objPosInicial.setIdposicionxrack(0);

                objMovimiento.setOrigen(objPosInicial);
                objMovimiento.setDestino(objPosAux);

                objMovimiento.setDetalleMovimiento(lstLineaMov);
                objMovimiento.setEstado("1");
                java.util.Date fecha = new Date();
                objMovimiento.setFecha(fecha);
                objMovimiento.setDescripcion("Ingreso por carga masiva del Pallet "+ objPallet.getIdPallet()+".");

                BEContacto objContacto = new BEContacto();
                objContacto.setIdPersona(lstIdContactos.get(i));
                objMovimiento.setContacto(objContacto);

                blmov.agregarInternamiento(objMovimiento);
                objGestorPosRack.actualizarPosicion(objPosAux);

                BELineaCardex auxLineaCardex = new BELineaCardex();

                auxLineaCardex.setIdProducto(getLstPallets().get(i).getProducto().getIdProducto());

                java.util.Date today = new java.util.Date();
                Timestamp fechaCardex = new Timestamp(today.getTime());

                auxLineaCardex.setFecha(fechaCardex);
                auxLineaCardex.setCantIngreso(getLstPallets().get(i).getCantidad());
                auxLineaCardex.setCantSalida(0);
                auxLineaCardex.setDetalle("Ingreso.");
                auxLineaCardex.setDestino(objPosAux.getIdposicionxrack());
                
                objGestotCardex.cargarCardexProducto(getLstPallets().get(i).getProducto().getIdProducto());
                auxLineaCardex.setTotalAlmacen(objGestotCardex.obtenerExistencias());
                
                objGestotCardex.guardarInternamiento(auxLineaCardex,pall.getIdPallet());
             }
            
            
        }
    }
    
    
    
    
    private void llenarArregloCadenas() throws FileNotFoundException, IOException
    {
        FileInputStream fstream = new FileInputStream(objfile);
        lstCadenas= new ArrayList<String>();
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String linea;

        while ((linea = br.readLine()) != null)
        {
            lstCadenas.add(linea);
        }
    }

    private void llenarArregloObjetos() throws ParseException {
        
        lstAmacenes= new ArrayList<BEAlmacen>();
        lstContactos = new ArrayList<BEContacto>();
        lstIdContactos = new ArrayList<Integer>();
        lstPaletas = new ArrayList<BEPaleta>();
        lstPallets =  new ArrayList<BEPallet>();
        lstProductos = new ArrayList<BEProducto>();
        lstRacks = new ArrayList<BERack>();
        lstZonas = new ArrayList<BEZona>();
        
        for (String linea: lstCadenas)
        {
            StringTokenizer tokens=new StringTokenizer(linea, "/");
            
            
                
                String str=tokens.nextToken();
                
                if (str.equals("paleta"))
                {
                    BEPaleta objPaleta = new BEPaleta();
                    
                    objPaleta.setIdPallet(Integer.parseInt(tokens.nextToken()));
                    objPaleta.setIdTipoPallet(Integer.parseInt(tokens.nextToken()));
                    objPaleta.setDescripcion(tokens.nextToken());
                    objPaleta.setEstado(Integer.parseInt(tokens.nextToken()));
                    objPaleta.setNombre(tokens.nextToken());
                    
                    getLstPaletas().add(objPaleta);
                }
                
                if(str.equals("zona"))
                {
                    BEZona objZona = new BEZona();
                    
                    objZona.setIdZona(Integer.parseInt(tokens.nextToken()));
                    objZona.setNombre(tokens.nextToken());
                    objZona.setCantRack(Integer.parseInt(tokens.nextToken()));
                    objZona.setDescripcion(tokens.nextToken());
                    objZona.setEstado(Integer.parseInt(tokens.nextToken()));
                    objZona.setIdTipo(Integer.parseInt(tokens.nextToken()));
                    
                    getLstZonas().add(objZona);
                    
                }
                
                if (str.equals("rack"))
                {
                    BERack objRack = new BERack();
                    
                    objRack.setIdRack(Integer.parseInt(tokens.nextToken()));
                    objRack.setNombre(tokens.nextToken());
                    objRack.setIdzona(Integer.parseInt(tokens.nextToken()));
                    objRack.setNumeroFilas(Integer.parseInt(tokens.nextToken()));
                    objRack.setNumeroColumnas(Integer.parseInt(tokens.nextToken()));
                    objRack.getPosicion().setFila(Integer.parseInt(tokens.nextToken())); //x
                    objRack.getPosicion().setColumna(Integer.parseInt(tokens.nextToken())); //y
                    objRack.setEstado(Integer.parseInt(tokens.nextToken()));
                    
                    getLstRacks().add(objRack);
                }
                
                if (str.equals("producto"))
                        
                {
                    BEProducto objProducto = new BEProducto();
                    
                    objProducto.setIdProducto(Integer.parseInt(tokens.nextToken()));
                    objProducto.setIdTipoProducto(Integer.parseInt(tokens.nextToken()));
                    objProducto.setIdProveedor(Integer.parseInt(tokens.nextToken()));
                    objProducto.setNombre(tokens.nextToken());
                    objProducto.setCantidad(Integer.parseInt(tokens.nextToken()));
                    objProducto.setDescripcion(tokens.nextToken());
                    objProducto.setEstado(Integer.parseInt(tokens.nextToken()));
                    objProducto.setStockMin(Integer.parseInt(tokens.nextToken()));
                    
                    
                    StringTokenizer tokensPXTP=new StringTokenizer(tokens.nextToken(), "-");
                    
                    while (tokensPXTP.hasMoreTokens())
                    {
                        BEProductoxTipoPallet objPTP = new BEProductoxTipoPallet();
                        
                        objPTP.setIdProducto(objProducto.getIdProducto());
                        objPTP.setIdTipoPallet(Integer.parseInt(tokensPXTP.nextToken()));
                        objPTP.setCantidad(Integer.parseInt(tokensPXTP.nextToken()));
                        objProducto.getLstProdxTipoPalleta().add(objPTP);
                    }
                    
                    objProducto.setFactorVencimiento(Double.parseDouble(tokens.nextToken()));
                    
                    getLstProductos().add(objProducto);
                 

                }
                
                if(str.equals("almacen"))
                {
                    BEAlmacen objAlmacen = new BEAlmacen();
                    
                    objAlmacen.setIdalmacen(Integer.parseInt(tokens.nextToken()));
                    objAlmacen.setNombre(tokens.nextToken());
                    objAlmacen.setDireccion(tokens.nextToken());
                    objAlmacen.setTelefono(Integer.parseInt(tokens.nextToken()));
                    objAlmacen.setAncho(Integer.parseInt(tokens.nextToken()));
                    objAlmacen.setLargo(Integer.parseInt(tokens.nextToken()));
                    
                    getLstAmacenes().add(objAlmacen);
                }
                
                if(str.equals("contacto"))
                {
                    
                    BEContacto objContacto = new BEContacto();
                    
                    objContacto.setIdPersona(Integer.parseInt(tokens.nextToken()));
                    objContacto.setNombre(tokens.nextToken());
                    objContacto.setApePaterno(tokens.nextToken());
                    objContacto.setApeMaterno(tokens.nextToken());
                    objContacto.setTipoDocumento(Integer.parseInt(tokens.nextToken()));
                    objContacto.setTelefono(Integer.parseInt(tokens.nextToken()));
                    objContacto.setDireccion(tokens.nextToken());
                    
                    SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
                    Date objFechaNac = null;
                    
                    objContacto.setFechaNacimiento(formatoDelTexto.parse(tokens.nextToken()));
                    
                    objContacto.setEmail(tokens.nextToken());
                    objContacto.setEstado(tokens.nextToken());
                    objContacto.setNroDocumento(Integer.parseInt(tokens.nextToken()));
                    
                    objContacto.setNombEmpresa(tokens.nextToken());
                    objContacto.setIdTipoContacto(Integer.parseInt(tokens.nextToken()));
                    
                    getLstContactos().add(objContacto);
                    
                }
                
                
                
                if (str.equals("pallet"))
                {
                    BEPallet objPallet = new  BEPallet();
                    
                    objPallet.setIdPallet(Integer.parseInt(tokens.nextToken()));
                    
                    //leo el codigo del producto
                    BEProducto objProducto = new BEProducto();
                    objProducto.setIdProducto(Integer.parseInt(tokens.nextToken()));
                    objPallet.setIdProducto(objProducto);
                            
                    //leo el codigo del la paleta                    
                    BEPaleta objPaleta = new BEPaleta();
                    
                    objPaleta=buscarPaletaLocal(Integer.parseInt(tokens.nextToken()));
                    //objPaleta.setIdPallet(Integer.parseInt(tokens.nextToken()));
                    objPallet.setPaleta(objPaleta);
                    
                    SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
                    Date objFechaVencimiento = null;
                    
                    objFechaVencimiento= formatoDelTexto.parse(tokens.nextToken());
                                       
                    
                    objPallet.setFechaVencimiento(objFechaVencimiento);
                    
                    Date objFechaRegistro= null;
                    
                    objFechaRegistro= formatoDelTexto.parse(tokens.nextToken());
                    
                    objPallet.setFechaRegistro(objFechaRegistro);
                    
                     objPallet.setCantidad(Integer.parseInt(tokens.nextToken()));
                    
                    getLstPallets().add(objPallet);
                    
                    Integer idContacto= new Integer(tokens.nextToken());
                    
                    lstIdContactos.add(idContacto);
                    
                    
                }
            
        }
        
        
        
    }

    public ArrayList<BEPaleta> getLstPaletas() {
        return lstPaletas;
    }

    public void setLstPaletas(ArrayList<BEPaleta> lstPaletas) {
        this.lstPaletas = lstPaletas;
    }

    public ArrayList<BEZona> getLstZonas() {
        return lstZonas;
    }

    public void setLstZonas(ArrayList<BEZona> lstZonas) {
        this.lstZonas = lstZonas;
    }

    public ArrayList<BEProducto> getLstProductos() {
        return lstProductos;
    }

    public void setLstProductos(ArrayList<BEProducto> lstProductos) {
        this.lstProductos = lstProductos;
    }

    public ArrayList<BERack> getLstRacks() {
        return lstRacks;
    }

    public void setLstRacks(ArrayList<BERack> lstRacks) {
        this.lstRacks = lstRacks;
    }

    public ArrayList<BEAlmacen> getLstAmacenes() {
        return lstAmacenes;
    }

    public void setLstAmacenes(ArrayList<BEAlmacen> lstAmacenes) {
        this.lstAmacenes = lstAmacenes;
    }

    public ArrayList<BEPallet> getLstPallets() {
        return lstPallets;
    }

    public void setLstPallets(ArrayList<BEPallet> lstPallets) {
        this.lstPallets = lstPallets;
    }

    public ArrayList<BEContacto> getLstContactos() {
        return lstContactos;
    }

    public void setLstContactos(ArrayList<BEContacto> lstContactos) {
        this.lstContactos = lstContactos;
    }

    private BEPaleta buscarPaletaLocal(int idPaleta) {
        
        for(BEPaleta pl:lstPaletas)
        {
            if (pl.getIdPallet()==idPaleta) return pl;
        }
        
        return lstPaletas.get(0);
    }
    
}
